/*
Driver.java
Fecha: 2 de septiembre de 2011
Autor: Claudia Grajeda
Descripcion: 
*/


import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
import java.util.InputMismatchException;

import java.util.*;


public class Driver {
	
	

	public static void main (String[] args){
	
		//declaracion de objetos
		Scanner ingreso = new Scanner(System.in);
		List<Cliente> data = new ArrayList<Cliente>();
		Cliente[] clientes;
		Cliente clientefuera = new Cliente();
		Cliente clienteadentro = new Cliente();
		
		ListCircular<Cliente> evento1 = new ListCircular<Cliente>();
		Arreglo<Cliente> evento2 = new Arreglo<Cliente>();
		
		int cantidad2, cantidad, entrada, transaccion;

		System.out.println("\n   HOJA DE TRABAJO 5 :O)\n");
		
		do{
			cantidad = (int)obtenerNumero("Ingrese:  1.  COLA CON LISTA CIRCULAR.\n          2. COLA CON UN ARREGLO \n", false);
			if ((cantidad<0) || (cantidad>2))
				System.out.println("ERROR, INGRESO INVALIDO");
			if (cantidad ==1){
				System.out.println("\nCOLA CON LISTA CIRCULAR\n");
			}
			if (cantidad ==2){
				System.out.println("\n  COLA CON UN ARREGLO  \n");
			}
			
		}
		while ((cantidad<0) || (cantidad>2));
		
		
		do{
			cantidad2 = (int)obtenerNumero("INGRESE LA CANTIDAD TOTAL DE CLIENTES ", false);
			if (cantidad2 <= 0 )
				System.out.println("ERROR");
		}
		while (cantidad2 <= 0);
		

		//agregar clientes a la lista
		clientes = new Cliente[cantidad2];
	
		for (int num1 =0; num1<cantidad2; num1++ ){
			clientes[num1] = new Cliente();
		}
			
	
		for (int num1 =0; num1<cantidad2; num1++ ){
			System.out.println("\n  INGRESE EL TIEMPO DE ENTRADA DEL CLIENTE " + (num1+1) + ":");
			entrada = ingreso.nextInt();
			if ((entrada <=0) || (entrada > 480)){
				System.out.println("ERROR, INGRESO INVALIDO");
				num1--;
			}
			else{
				
				if (num1 > 0){
					int num2 = num1-1;
					if (clientes[num2].getEntrada()  > entrada){  
						System.out.println("ERROR, EL NUMERO INGRESADO ES MENOR AL TIEMPO ANTERIOR");
						num1--;
					}
					if (clientes[num2].getEntrada() <=  entrada ){ 
						clientes[num1].setEntrada(entrada);                    
					}
				}
				else
					clientes[num1].setEntrada(entrada);
			}
			
		}
		
		for (int num1 =0; num1<cantidad2; num1++ ){
			data.add(clientes[num1]);
		}	
		
			
		System.out.println("\n Se han ingresado todas las horas de entrada, gracias!! \n");
			
		for (int num1 =0; num1<cantidad2; num1++ ){
			System.out.println(clientes[num1].toSting());
		
		}
		
		//ingresar clientes a columna
		int actual = data.get(0).getEntrada();
		
		System.out.println("Hora actual: " + actual);
		
		
		//todo lo del banco
		//1. ingresar a la cola si estamos en el tiempo q entraron
		//2. obtener tiempo de transaccion del primero de cada cola y cambiar evento
		//3. regresar el cliente con el tiempo final y evento de salida a data
		//4. obtener nueva hora 
		for (int num1 =0; num1<cantidad2; num1++ ){
			if (data.get(num1).getEvento()){   //evento true
				clienteadentro = data.get(num1);
				if (clienteadentro.getEntrada() == actual );{//si estamos en el tiempo q entro moverlo a la cola
					if (cantidad == 1){
						clientefuera =data.remove(num1);    //quitar d la lista d eventos
						evento1.add(clientefuera);    //moverlo a la cola   1.
						evento1.setTransaccion();			//tiempo de transaccion
						clientes[num1]=evento1.remove(num1);	//obtener o quitar  el primero de la cola
						
						clientes = evento1.ordenar(clientes,cantidad2 );	//ordenar
					}
				}
			}
			else{ //imprimir
				System.out.println(data.get(num1).toSting());
				
			}
					
			actual =data.get(num1++).getEntrada();
				
		}
		
		
	
	}
	
	//ObtenerNumero
		 public static double obtenerNumero(String mensaje, boolean mostrar){
			 Scanner ingreso = new Scanner(System.in);
		     double num = -1;
		        
		     System.out.print(mensaje);
		     try{
		    	 num = ingreso.nextDouble();
		     }
		     catch(InputMismatchException exception){
		         if (mostrar)
		        	 System.out.println("\nERROR: ~~> Dato invalido. :O(\n");
		     }
		     finally{
		    	 ingreso.nextLine();//Atrapar el ENTER
		     }
		     return num;
		 }
	
}
